package classes.adjuntas;

import classe.grafica.Chat;                                                     //Importação da classe chat
import classes.gerais.Contato;                                                  //Importação da classe contato
import classes.gerais.Favorito;                                                 //Importação da classe favorito  
import java.util.ArrayList;                                                     //Importação da classe array list
import javax.swing.JOptionPane;                                                 //Importação da classe de mensagens

public class AuxiliarContatos {                                                 //Classe AuxiliarContatos - classe para dar suporte aos contatos e conexões
    private ArrayList<Chat> Iniciados;                                          //Iniciados - Todas as conexões entre todas as comunicações entre contatos iniciados

public AuxiliarContatos (){                                                     //Montador que inicia o elemento
    Iniciados = new ArrayList();                                                //Inicia o array list
}

public void InserirChat (Chat Insere){                                          //Método para inserir um chat
    Iniciados.add(Insere);                                                      //Insere chat
}

public void RemoverChat (Contato Remove){                                       //Método que remove um chat existente
    Chat Remover;                                                               //Refrencia o chat que será removido
    Remover = ExistenciaContatoChat(Remove);                                    //Procura o chat a ser removido
    if (Remover != null){                                                       //Se o chat que vai ser removido existir...
        Remover.DesligarServidor();                                             //Desliga o mesmo
        Iniciados.remove(Remover);                                              //Remove do array list
    }
}

public Chat ExistenciaContatoChat (Contato Verificar){                          //Método que veridica a existência de um chat
    for (Chat Janela : Iniciados) {                                             //Para cada chat iniciado 
        if (Janela.RetornaPorta()==Verificar.DevolvePorta()) return Janela;     //Verifica se é o procurado, se sim, retorne o chat
    }
    return null;                                                                //Se nãoo encontrar retorna null
}

public int VerificaPortas (String Porta, ArrayList<Contato> Contatos){          //Método que visa verificar se uma porta já esta sendo ocupada
    int PortaInt = Integer.parseInt(Porta);                                     //Transforma a porta em um inteiro
    for (Contato C : Contatos){                                                 //Para cada contato existente em contatos
        if (C.DevolvePorta() == PortaInt) return 0;                             //Verifica se a porta existe, se sim, retorna 0
    }
return 1;                                                                       //Se não existir, retorna 1
}

public String GerenciaPorta (String Porta, int LimInf, int LimSup, ArrayList<Contato> Contatos){    //Método que faz todo o gerenciamento das portas
    if(!Porta.matches("^[0-9]*$")) Porta = "1024";                                                  //Se a porta não for números seta como 1024 - 1024 é uma porta de erro
    if(VerificaPortas(Porta, Contatos)==0) Porta = "1024";                                          //Se a porta já existir seta como 1024
    while (Integer.parseInt(Porta)<LimInf || Integer.parseInt(Porta)>LimSup){                       //Se a porta não estiver dentro dos limites
        Porta = null;                                                                               //Torna nula para o teste
        Porta = (String)JOptionPane.showInputDialog("(Porta inválida)Digite a porta de acesso:");   //Pede uma nova porta
        if (Porta == null) return null;                                                             //Se a porta for nula, retorna null
        if(VerificaPortas(Porta, Contatos)==0) Porta = "1024";                                      //Faz a verificação de pré existência novamente
        if(!Porta.matches("^[0-9]*$")) Porta = "1024";                                              //Verifica se é um número novamente
    }
return Porta;                                                                                       //Se tudo der certo, retorna a porta
}

public ArrayList<Contato> DevolveSuperClasse (ArrayList<Favorito> Favoritos){
    ArrayList<Contato> Contatos = new ArrayList();
    for (Favorito Busca : Favoritos){
        Contatos.add(Busca);
    }
    return Contatos;
}

public boolean VerificarNome (String Nome, ArrayList<Contato> Contatos){
    Contato Busca;
    
    for (Contato BuscaL : Contatos){
        if (BuscaL.DevolveNome().equals(Nome)){
            return false;
        }
    }
    
    return true;
}

}
